package tool.classloader;

import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.List;
import java.util.Vector;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;

/**la classe permette di esaminare un particolare Jar per reperire tutti file che esso contiene.
 * 
 * @author koldar
 * @version 1.0
 */
public class JarExaminator extends Object{

	/**indica il file che punta al .jar da esaminare*/
	private File jarFile;
	/**indica lo stream usato per ricavare i dati dal Jar file*/
	private JarInputStream stream;
	/**indica la lista di JarEntry incapsulate nel Jar*/
	private List<JarEntry> contentList;
	
	
	public JarExaminator(File _jarFile) throws FileNotFoundException, IOException{
		super();
		if (!this.isJar(_jarFile)){
			throw new FileNotSupportedException(_jarFile);
		}
		this.jarFile=_jarFile;
		this.contentList=new Vector<JarEntry>(0,1);
		this.stream=new JarInputStream(new FileInputStream(this.jarFile));
		this.examineJar();
	}
	
	/**
	 * 
	 * @param filter il filtro da usare per smistare i file all'interno del jar
	 * @return l'elenco delle JarEntry che rispettano il filtro
	 */
	public List<JarEntry> getList(FileFilter filter){
		Vector<JarEntry> result=new Vector<JarEntry>(0,1);
		for (JarEntry j: this.contentList){
			if (filter.accept(new File(j.getName()))){
				result.add(j);
			}
		}
		return result;
	}
	
	/**
	 * @return the contentList. For further information visit {@link #contentList}
	 */
	public List<JarEntry> getContentList() {
		return contentList;
	}

	private static boolean isJar(File file){
		return file.getAbsolutePath().endsWith(".jar");
	}
	
	private void examineJar() throws IOException{
		JarEntry entry;
		do{
			entry=this.stream.getNextJarEntry();
			this.contentList.add(entry);
		} while (entry!=null);
		this.contentList.remove(null);
	}
}
